package com.toonan.system.service;

import java.util.List;
import java.util.Locale;

import org.assertj.core.util.Lists;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Collation;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;

import com.toonan.core.constant.WebplusCons;
import com.toonan.core.matatype.Dto;
import com.toonan.core.util.WebplusMongo;
import com.toonan.core.util.WebplusUtil;
import com.toonan.core.vo.PageResult;
import com.toonan.core.vo.TreeModel;
import com.toonan.system.constant.SystemCons;
import com.toonan.system.dao.MenuDao;
import com.toonan.system.model.Menu;

/**
 * 
 * @ClassName:  MenuService   
 * @Description:菜单业务逻辑
 * @author: 陈骑元（chenqiyuan@toonan.com)
 * @date:   2022年2月23日 下午9:29:49     
 * @Copyright: 2022 www.toonan.com Inc. All rights reserved. 
 * 注意：本内容仅限于广州市图南软件有限公司内部传阅，禁止外泄以及用于其他的商业目
 */
@Service
public class MenuService {
	
	@Autowired
	private MenuDao menuDao;
	
	/**
	 * 
	 * 简要说明：根据id查询当前菜单
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年2月23日 下午9:37:40 
	 * @param 说明
	 * @return 说明
	 */
	public Menu findById(String id) {
		
		return this.menuDao.findById(id);
	}
    /**
     * 
     * 简要说明：检查当前菜单编号的数量
     * 编写者：陈骑元（chenqiyuan@toonan.com）
     * 创建时间： 2022年2月23日 下午9:39:53 
     * @param 说明
     * @return 说明
     */
	public long findCountByParentId(String parentId) {
		
		Query query=WebplusMongo.eq("parentId", parentId);
		
		return this.menuDao.count(query);
	}
	/**
	 * 
	 * 简要说明：根据id编号删除
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年2月23日 下午9:43:10 
	 * @param 说明
	 * @return 说明
	 */
	public boolean removeById(String id) {
		
		return this.menuDao.removeById(id);
	}
	/**
	 * 
	 * 简要说明：根据菜单父编号删除
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年2月23日 下午9:44:53 
	 * @param 说明 parentId 父编号
	 * @return 说明
	 */
	public boolean removeByParentId(String parentId) {
		Query query=WebplusMongo.eq("parentId", parentId);
		
		return this.menuDao.remove(query);
	}
	/**
	 * 
	 * 简要说明：通过id更新菜单
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年2月23日 下午9:48:58 
	 * @param 说明
	 * @return 说明
	 */
	public boolean updateById(Menu menu) {
		
		return this.menuDao.updateById(menu);
	}
	/**
	 * 
	 * 简要说明：通过父编号查询当前语义编号
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年2月22日 下午8:00:36 
	 * @param 说明
	 * @return 说明
	 */
	public String getCascadeId(String parentId) {
		Query query=new Query();
		WebplusMongo.eq(query, "parentId", parentId);
		Collation collation = Collation.of(Locale.CHINESE).numericOrdering(true);
		query.collation(collation);
		WebplusMongo.withSortDesc(query, "cascadeId");
		Menu subMenu=menuDao.findOne(query);
		String maxCascadeId="";
		if(WebplusUtil.isNotEmpty(subMenu)) {
			maxCascadeId=subMenu.getCascadeId();
		}else {
			Menu parentMenu=this.findById(parentId);
			if(WebplusUtil.isEmpty(parentMenu)){
					maxCascadeId="0.0000";
			}else{
				maxCascadeId=parentMenu.getCascadeId()+".0000";
			}
		}
		return WebplusUtil.createCascadeId(maxCascadeId, 9999);
		
	}
	 /**
	  * 加载菜单树
	  */
	public List<TreeModel> loadMenuTree(String parentId) {
		List<Menu> menuList=this.findListByParentId(parentId);
		List<TreeModel> modelList=Lists.newArrayList();
		TreeModel rootModel=new TreeModel();
		rootModel.setName(SystemCons.MENU_ROOT_NAME);
		rootModel.setId(SystemCons.TREE_ROOT_ID);
		rootModel.setCascadeId(SystemCons.TREE_ROOT_CASCADE_ID);
		rootModel.setOpen(true);
		modelList.add(rootModel);
		for(int i=0;i<menuList.size();i++){
			Menu menu=menuList.get(i);
			TreeModel treeModel=new TreeModel();
			treeModel.setId(menu.getMenuId());
			treeModel.setpId(menu.getParentId());
			treeModel.setCascadeId(menu.getCascadeId());
			treeModel.setName(menu.getMenuName());
			String is_auto_expand = menu.getIsAutoExpand();
			if(WebplusCons.WHETHER_YES.equals(is_auto_expand)){
				treeModel.setOpen(true);
			}
			treeModel.setChildren(null);
			treeModel.setChecked(false);
		    modelList.add(treeModel);
			
		}
		return modelList;
	}
	
	/**
	 * 
	 * 
	 * 简要说明：通过父节点查询下面列表
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年2月22日 下午8:39:01 
	 * @param 说明
	 * @return 说明
	 */
	public List<Menu> findListByParentId(String parentId){
		Query query=new Query();
		WebplusMongo.eq(query, "parentId", parentId);
		Collation collation = Collation.of(Locale.CHINESE).numericOrdering(true);
		query.collation(collation);
		WebplusMongo.withSortAsc(query, "cascadeId");
		WebplusMongo.withSortAsc(query, "sortNo");
		
		return this.menuDao.findList(query);
	}
	
	/**
	 * 
	 * 简要说明：分页查询
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年2月21日 下午10:45:53 
	 * @param 说明
	 * @return 说明
	 */
	public PageResult findPage(Dto pDto) {
		Query query=new Query();
		WebplusMongo.like(query, "menuName", pDto);
		WebplusMongo.like(query, "menuCode", pDto);
		WebplusMongo.llike(query, "cascadeId",pDto);
		WebplusMongo.eq(query, "status", pDto);
		WebplusMongo.eq(query, "editMode", pDto);
		WebplusMongo.eq(query, "menuType", pDto);
		Collation collation = Collation.of(Locale.CHINESE).numericOrdering(true);
		query.collation(collation);
		WebplusMongo.withSortAsc(query, "cascadeId");
		WebplusMongo.withSortAsc(query, "sortNo");
		PageResult pageResult=new PageResult(pDto);
		return menuDao.findPage(query, pageResult);
	}
	/**
	 * 
	 * 简要说明：检查菜单编码唯一性
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年2月23日 下午10:08:39 
	 * @param 说明 存在true
	 * @return 说明
	 */
	public boolean checkMenuCodeUnion(String parentId,String menuCode) {
		Query query=new Query();
		WebplusMongo.eq(query, "parentId", parentId);
		WebplusMongo.eq(query, "menuCode", menuCode);
		return this.menuDao.count(query)>0;
		
	}
	/**
	 * 
	 * 简要说明：批量保存
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年2月23日 下午10:12:31 
	 * @param 说明
	 * @return 说明
	 */
	public void insertBatch(List<Menu> menuList) {
		
		for(Menu menu:menuList) {
			this.menuDao.insert(menu);
		}
	}
	/**
	 * 
	 * 简要说明：根据语义编号更新菜单
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年2月26日 下午8:37:21 
	 * @param 说明
	 * @return 说明
	 */
	public boolean  updateMenu(String cascadeId,Menu menu) {
		 
		return this.menuDao.udpateMenu(cascadeId, menu);
	}
}
